﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpDevService.h"

namespace gcmp
{
    /// \brief  GCMP所支持的配置文件中的配置项记录的类型
    ///  
    /// 注意：若要添加新项，请同步添加对应字符串至s_configRecordTypeNames
    enum class GcmpConfigRecordType : int32_t
    {
        InValid = 0,   ///< 无效类型
        String,        ///< 字符串类型
        Int,           ///< 整数类型
        Double,        ///< 双精度浮点数类型
        Num_Of_Types   ///< 支持的类型总数
    };

    /// \brief  配置文件的一条配置项记录
    FINAL_INTERFACE class GCMP_DEV_SERVICE_EXPORT IConfigRecord
    {
    public:
        /// \brief 获取GCMP支持的配置项记录的类型名。
        /// \return 返回配置项记录类型名的集合。
        static const std::vector<std::wstring>& GetGcmpConfigRecordTypeNames();

    public:
        /// \brief 通过名字和字符串类型值创建配置项记录。
        /// \param name 配置项记录名称。
        /// \param stringValue 配置项记录字符串类型值。
        /// \return 返回配置项记录，如果不存在，则返回nullptr。
        static OwnerPtr<IConfigRecord> Create(const std::wstring& name, const std::wstring& stringValue);

        /// \brief 通过名字和整数类型值创建配置项记录。
        /// \param name 配置项记录名称。
        /// \param stringValue 配置项记录整数类型值。
        /// \return 返回配置项记录，如果不存在，则返回nullptr。
        static OwnerPtr<IConfigRecord> Create(const std::wstring& name, int intValue);

        /// \brief 通过名字和字符串类型值创建配置项记录。
        /// \param name 配置项记录名称。
        /// \param stringValue 配置项记录双精度浮点数类型值。
        /// \return 返回配置项记录，如果不存在，则返回nullptr。
        static OwnerPtr<IConfigRecord> Create(const std::wstring& name, double doubleValue);

    public:  

        /// \brief 克隆一份配置项记录对象。
        /// \return 返回克隆的配置项记录对象。
        virtual OwnerPtr<IConfigRecord> Clone() const = 0;

    public:
        /// \brief 获取配置项记录的类型。
        /// \return 返回配置项记录的类型。
        virtual GcmpConfigRecordType GetType() const = 0;

        /// \brief 获取配置项记录的名称。
        /// \return 返回配置项记录的名称。
        virtual std::wstring GetName() const = 0;

        /// \brief 获取配置项记录的字符串类型值。
        /// \return 返回配置项记录的字符串类型值。
        virtual std::wstring GetValueAsString() const = 0;

        /// \brief 获取配置项记录的整数类型值。
        /// \return 返回配置项记录的整数类型值。
        virtual int GetValueAsInt() const = 0;

        /// \brief 获取配置项记录的双精度浮点数类型值。
        /// \return 返回配置项记录的双精度浮点数类型值。
        virtual double GetValueAsDouble() const = 0;

        /// \brief 获取配置项记录的任何类型值的字符串。
        /// \return 返回配置项记录的任何类型值的字符串。
        virtual std::wstring GetStringOfValue() const = 0;

    public:
        /// \brief 配置项记录是否为内部标识码。
        /// \return true-为内部标识码；false-不为内部标识码。
        virtual bool IsInternalIdentifyCodeValue() const = 0;
    };
}
